package kr.co.bettersoft.waitnumberstoret.fragment;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.waitnumberstoret.activity.R;
import kr.co.bettersoft.waitnumberstoret.adapter.MemberStoreReviewListAdapter;
import kr.co.bettersoft.waitnumberstoret.common.CommonConstant;
import kr.co.bettersoft.waitnumberstoret.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstoret.domain.WaitingNumberStore;
import kr.co.bettersoft.waitnumberstoret.domain.WaitingRecommendation;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class ReviewListFragment extends Fragment {
	String TAG = "ReviewListFragment";

	final int SELECT_RECOMMENDATION_INFORMATION = 601; 				 // 리뷰 리스트	-- 가맹점 정보 - 이전에 이미 조회함.
	final int SELECT_MERCHANT_RECOMMENDATION_LIST = 603;		// 가맹점 리뷰 리스트 		

	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;

	String merchantId;	//  가맹점 아이디
	// 설정 파일 저장소  	
	SharedPreferences sharedPrefCustom;
	/////////////////////////////////////////////////////////////////////////////

	// 서버 통신용
	//	String certiResult="";
	WaitnumberStoreMRest waitnumberStoreMRest;
	//	String callResult = "";
	//	String tempstr = "";
	//	JSONObject jsonObject;

	// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
	Boolean isFinished = false;

	// 중복 실행 방지용
	int isUpdating = 0;
	int dontTwice = 1;
	public static Boolean searched = false;		// 조회 했는가?
	int isRunning = 0;

	// 화면 구성
	TextView titleBar;		// 타이틀
	View emptyView;
	ListView listView;

	View memberStoreReviewMerchantInfoLayout;

	// 별점
	TextView merchantRatingTextView;
	RatingBar merchantRatingBar;

	// 진행바
	ProgressBar pb1;

	public WaitingNumberStore merchantData = new WaitingNumberStore();	// 결과 저장해서 보여주기 위한 도메인.

	public List<WaitingRecommendation> entries;	// 1차적으로 조회한 결과. (가맹점 상세 정보 제외)
	List<WaitingRecommendation> entriesFn = null;

	///////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showYN")==1){		// 받아온 마일리지 결과를 화면에 뿌려준다.

					// 상단 가맹점명, 평점 정보
					if(merchantData.getEvaluationValue()!=null && merchantData.getEvaluationValue().length()>0 && !(merchantData.getEvaluationValue().equals("null"))){
						//						Log.d(TAG,"merchantData.getEvaluationValue():"+merchantData.getEvaluationValue());
						merchantRatingTextView.setText(merchantData.getEvaluationValue()+"/"+((int)Float.parseFloat(merchantData.getEvaluationCount()))+"명");   // 평점  	// 평가수
						merchantRatingBar.setRating(Float.parseFloat(merchantData.getEvaluationValue())/2);
						memberStoreReviewMerchantInfoLayout.setVisibility(View.VISIBLE);
					}

					// 최종 결과 배열은 entriesFn 에 저장되어 있다.. 
					if(entriesFn!=null && entriesFn.size()>0){
						setListing();
					}else{
						Log.d(TAG,"no data");
						listView.setEmptyView(emptyView);
						listView.setVisibility(View.GONE);			//   0 visible   4 invisible   8 gone
						emptyView.setVisibility(View.VISIBLE);
					}
					isRunning = 0;
				}

				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}

				if(b.getInt("order")==1){
					// 러닝바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 러닝바 종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(getActivity(), R.string.error_message, Toast.LENGTH_SHORT).show();
				}

				switch (msg.what)
				{
				case SELECT_RECOMMENDATION_INFORMATION  : 
					if(getActivity()!=null) {
						//						threadSelectRecommendationInformation();
						getActivity().runOnUiThread(new RunnableSelectRecommendationInformation());
					}
					break;
				case SELECT_MERCHANT_RECOMMENDATION_LIST  : if(getActivity()!=null) getActivity().runOnUiThread(new RunnableSelectMerchantRecommendationList());	
				break;
				default : 
					break;
				}				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/** Called when the activity is first created. */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.fragment_review_list, null);

		waitnumberStoreMRest = new WaitnumberStoreMRest();

		titleBar = (TextView) view.findViewById(R.id.title_bar);
		listView  = (ListView)view.findViewById(R.id.listview);
		emptyView = view.findViewById(R.id.empty1);

		// 가맹점 평점
		merchantRatingTextView = (TextView) view.findViewById(R.id.merchant_rating_text);
		merchantRatingBar = (RatingBar) view.findViewById(R.id.merchant_rating_bar);

		memberStoreReviewMerchantInfoLayout = (View)view.findViewById(R.id.member_store_review_merchant_info_layout);


		// 폰트 지정.
		typefaceNanumGothic = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothic);  
		typefaceNanumGothicBold = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothicBold);
		// 폰트 적용
		titleBar.setTypeface(typefaceNanumGothic);	
		merchantRatingTextView.setTypeface(typefaceNanumGothic);	

		pb1 = (ProgressBar) view.findViewById(R.id.member_store_review_list_progress_bar);

		searched = false;		 

		// prefs
		sharedPrefCustom = getActivity().getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		merchantId = sharedPrefCustom.getString("merchantId", "");	
		if(merchantId.length()<1){
			Log.d(TAG,"no saved merchantId");
			getActivity().finish();
		}

		// 1차 
		handler.sendEmptyMessage(SELECT_RECOMMENDATION_INFORMATION);

		return view;
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * setListing
	 *  리스트 보여주고 클릭 이벤트 등록 (가맹점 상세 보기)한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setListing(){
		listView.setAdapter(new MemberStoreReviewListAdapter(getActivity(), entriesFn));
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////	

	/**
	 * 가맹점에 대한 사용자들의 추천 정보를 가져온다. - 평점 갱신용도
	 */
	private void threadSelectRecommendationInformation() {
		Log.d(TAG, "threadSelectRecommendationInformation");
		Thread thread = new Thread(new Runnable() {
			public void run() {
				selectRecommendationInformation();
			}
		});
		thread.start();
	}
	private void selectRecommendationInformation() {
		Log.d(TAG, "selectRecommendationInformation");
		//				// 파리미터 세팅
		WaitingNumberStore merchantParam = new WaitingNumberStore();
		merchantParam.setMerchantId(merchantId);
		// 서버 메소드 호출
		if(FragmentHome.restCallCntUp()){
			showPb();
			if(!isFinished){
				String callResult = waitnumberStoreMRest.RestSelectRecommendationInformation(merchantParam);
				isRunning = 0;
				// 결과 처리	 
				if(!(callResult.equals("F"))){ //  성공
					// 평점 갱신한다. 화면 상단
					processMerchantStoreInfoData(callResult);	
				}else{ 					//  실패
				}
			}
			hidePb();
			FragmentHome.restCallCntDown();
		}
		// 리뷰 리스트를 보여준다.
		handler.sendEmptyMessage(SELECT_MERCHANT_RECOMMENDATION_LIST);		//			showInfo(); // 나중에 평점도 갱신한다
	}



	/**
	 * 러너블. 가맹점에 대한 사용자들의 추천 정보를 가져온다. - 평점 갱신용도
	 */
	class RunnableSelectRecommendationInformation implements Runnable {
		public void run(){
			new backgroundSelectRecommendationInformation().execute();
		}
	}
	/**
	 * backgroundSelectRecommendationInformation
	 *  비동기로 가맹점에 대한 사용자들의 추천 정보를  가져온다. - 평점 갱신용도
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectRecommendationInformation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectRecommendationInformation");

			//				// 파리미터 세팅
			WaitingNumberStore merchantParam = new WaitingNumberStore();
			merchantParam.setMerchantId(merchantId);
			// 호출
			// if(!pullDownRefreshIng){
			showPb();
			// }
			String callResult = waitnumberStoreMRest.RestSelectRecommendationInformation(merchantParam);
			//			hidePb();
			isRunning = 0;
			// 결과 처리	 
			if(!(callResult.equals("F"))){ //  성공
				// 평점 갱신한다. 화면 상단
				processMerchantStoreInfoData(callResult);	
			}else{ 					//  실패
				showResultDialog(getResources().getString(R.string.request_failed));
			}
			// 리뷰 리스트를 보여준다.
			handler.sendEmptyMessage(SELECT_MERCHANT_RECOMMENDATION_LIST);		//			showInfo(); // 나중에 평점도 갱신한다
			return null ;
		}
	}


	/**
	 * 러너블. 가맹점에 대한 리뷰 리스트를 가져온다.		// SELECT_MERCHANT_RECOMMENDATION_LIST  selectMerchantRecommendationList
	 */
	class RunnableSelectMerchantRecommendationList implements Runnable {
		public void run(){
			new backgroundSelectMerchantRecommendationList().execute();
		}
	}
	/**
	 * backgroundSelectMerchantRecommendationList
	 *  비동기로 가맹점에 대한 리뷰 리스트를 가져온다.	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectMerchantRecommendationList extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectMerchantRecommendationList");

			//			// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			waitingRecommendationParam.setMerchantId(merchantId);
			// 서버 메소드 호출
			if(FragmentHome.restCallCntUp()){
				if(!isFinished){
					String callResult = waitnumberStoreMRest.RestSelectMerchantRecommendationList(waitingRecommendationParam, returnThis());		
					//					// 결과 처리		 
					if(!(callResult.equals("F"))){
						try {
							JSONArray jsonArray2 = new JSONArray(callResult);
							int max = jsonArray2.length();

							entriesFn = new ArrayList<WaitingRecommendation>(max);
							String tmp_memberId = "";
							String tmpstr2 = "";
							String tmp_registerDate = "";
							String tmp_evaluation = "";
							String tmp_content = "";
							if(max>0){
								for ( int i = 0; i < max; i++ ){
									JSONObject  jsonObject = jsonArray2.getJSONObject(i);
									//  idCheckMileageMileages,  mileage,  modifyDate,  checkMileageMembersCheckMileageID,  checkMileageMerchantsMerchantID
									// 객체 만들고 값 받은거 넣어서 저장..  저장값: 인덱스번호, 수정날짜, 아이디, 가맹점아이디.
									try{
										tmp_memberId = jsonObject.getString("memberId");
									}catch(Exception e){
										tmp_memberId = "";
									}
									try{
										tmp_registerDate = jsonObject.getString("registerDate");
										if(tmp_registerDate.length()>9){
											//												tmpstr2 = tmp_registerDate.substring(0, 4)+ "-" 		// 년
											//												+ tmp_registerDate.substring(5, 7)+ "-" 					// 월
											//												+ tmp_registerDate.substring(8, 10) 					// 일
											//												;
											//												tmp_registerDate = tmpstr2;

											// 원하는 날짜 형식에 맞춰서 데이터 넣기
											int dayOfRegisterDate = 0;	// 오전 오후 분간용
											String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
											String strAMPM = "";
											// 오전 오후 분간하기
											dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
											if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
												dayOfRegisterDate = dayOfRegisterDate - 12;
												strAMPM = getString(R.string.pm_of_day)+"";
											}else{				// 12시 이전 = 오전
												strAMPM = getString(R.string.am_of_day)+"";
											}
											// 두자리로 맞추기.
											dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
											if(dayOfRegisterDate<10){		
												dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
											}
											tmp_registerDate = 
												tmp_registerDate.substring(0, 4)+ getString(R.string.year) 
												+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
												+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
												+ " " + strAMPM + " " 
												+dayOfRegisterDateStr + getString(R.string.hour) 
												+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
												+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
										}
									}catch(Exception e){
										tmp_registerDate = "";
									}
									try{
										//								tmp_evaluation = jsonObject.getString("evaluation");
										tmp_evaluation = (int)Float.parseFloat(jsonObject.getString("evaluation"))+"";	// 소수점 제거
									}catch(Exception e){
										tmp_evaluation = "0";
									}
									try{
										tmp_content = jsonObject.getString("content");
									}catch(Exception e){
										tmp_content = "";
									}
									entriesFn.add(new WaitingRecommendation(tmp_memberId,
											tmp_registerDate,
											tmp_evaluation,
											tmp_content
									));
								}
							}							
						} catch (Exception e1) {
							e1.printStackTrace();
						}
					}
					FragmentHome.restCallCntDown();
				}
			}
			hidePb();
			isRunning = 0;
			showInfo();	// 보여주기.
			return null ;
		}
		
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	 * 서버로부터 받아온 가맹점 정보를 파싱하여 화면에 뿌려준다.
	 */
	public void processMerchantStoreInfoData(String callResult){
		try{

			try {
				JSONObject jsonObject = new JSONObject(callResult);
				// 데이터를 전역 변수 도메인에 저장하고 핸들러를 통해 도메인-> 화면에 보여준다..
				try{
					merchantData.setCompanyName(jsonObject.getString("companyName"));			// 총점	
				}catch(Exception e){
					merchantData.setCompanyName("");
				}
				try{
					merchantData.setEvaluationTotal(jsonObject.getString("totalEvaluation"));			// 총점	
				}catch(Exception e){
					merchantData.setEvaluationTotal("0");
				}
				try{
					merchantData.setEvaluationCount(jsonObject.getString("totalMember"));			// 추천수	
				}catch(Exception e){
					merchantData.setEvaluationCount("0");
				}
				try{
					merchantData.setEvaluationValue(jsonObject.getString("averageEvaluation"));			// 평점
				}catch(Exception e){
					merchantData.setEvaluationValue("0");
				}
			} catch (JSONException e) {
				e.printStackTrace();
			} 
		}catch(Exception e){
			e.printStackTrace();
			// 데이터 없음인데..
			merchantData.setEvaluationTotal("0");
			merchantData.setEvaluationCount("0");
			merchantData.setEvaluationValue("0");
		}

	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////


	public void alertToUser(){				// 	data 조회가 잘 안됐어요. // 별도 알림 없이 로그만 찍는다.
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}


	/**
	 * showInfo
	 *  결과 도메인을 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return getActivity();
	}

	/**
	 * showResultDialog
	 * 얼럿창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		if(getActivity()!=null){
			getActivity().runOnUiThread(new Runnable(){		 
				@Override
				public void run(){
					Message message = handler.obtainMessage();				
					Bundle b = new Bundle();
					b.putInt("showAlert", 1);
					b.putString("msg", msg);			// 화면에 보여줄 메시지
					message.setData(b);
					handler.sendMessage(message);
				}
			});
		}
	}


	// 진행바 보임 / 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * onResume
	 *  액티비티 리쥼시 닫기 카운터초기화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		isFinished = false;
		FragmentHome.app_end = 0;
	}
	@Override
	public void onPause(){
		super.onPause();
		isFinished = true;
	}
	/////////////////////////////////////////////////////////////////////////////////////////////////////////	

}
